package top.whysu.edevice.service.ezviz;

import top.whysu.edevice.dto.ezviz.child.ChildTokenResponseDTO;
import top.whysu.edevice.dto.ezviz.policy.EzvizPolicy;
import top.whysu.edevice.dto.ezviz.policy.EzvizStatement;
import top.whysu.edevice.dto.ezviz.token.TokenDTO;
import top.whysu.edevice.dto.ezviz.token.TokenWithAccountDTO;
import top.whysu.edevice.po.manage.ManageDevicePO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 萤石Token
 */
public interface EzvizTokenService {

    /**
     * 根据凭证组id和账号id获取accessToken以及账号等信息（过期的话会重新获取）
     *
     * @param accountId 账号id
     * @param voucherId 凭证组id
     * @return token以及账号信息
     */
    TokenWithAccountDTO getToken(BigDecimal accountId, BigDecimal voucherId);

    /**
     * 根据凭证组id获取其下所有账号token信息
     *
     * @param voucherId 凭证组id
     * @return token以及账号信息集合
     */
    List<TokenWithAccountDTO> getTokenAccountList(BigDecimal voucherId);

    /**
     * 获取子账号的accessToken
     *
     * @param accountId 账号id
     * @return 子账号accessToken和expireTime等信息
     */
    TokenWithAccountDTO getChildAccountToken(BigDecimal accountId);

    /**
     * 根据凭证组id获取accessToken等信息（过期的话会重新获取）
     *
     * @param voucherId 凭证组id
     * @return token等信息
     */
    TokenDTO getTokenByVoucherId(BigDecimal voucherId);

    /**
     * 新增账号的密码规则
     *
     * @param currentPassword 当前密码
     * @param appKey          appKey
     * @return 萤石需要的密码形式
     */
    String ezvizPassword(String currentPassword, String appKey);

    /**
     * 获取授权策略
     *
     * @param devicePOList 设备列表
     * @param roleSign     角色标志{@link top.whysu.edevice.constant.DataDictionary.RoleSign}
     * @return 授权策略
     */
    EzvizPolicy getPolicy(List<ManageDevicePO> devicePOList, String roleSign);

    /**
     * 获取Statement
     *
     * @param devicePOList 设备列表
     * @param roleSign     角色标志{@link top.whysu.edevice.constant.DataDictionary.RoleSign}
     * @return Statement
     */
    EzvizStatement getStatement(List<ManageDevicePO> devicePOList, String roleSign);

}
